package net.hn.hnms.sys.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.hn.hnms.sys.common.core.constant.Constants;
import net.hn.hnms.sys.common.core.exception.HuaNengException;
import net.hn.hnms.sys.common.core.utils.StringUtils;
import net.hn.hnms.sys.common.mybatis.core.page.PageQuery;
import net.hn.hnms.sys.common.mybatis.core.page.TableDataInfo;
import net.hn.hnms.sys.common.satoken.utils.LoginHelper;
import net.hn.hnms.sys.system.api.model.LoginUser;
import net.hn.hnms.sys.system.domain.SysNotice;
import net.hn.hnms.sys.system.domain.UserNoticeStatus;
import net.hn.hnms.sys.system.mapper.SysNoticeMapper;
import net.hn.hnms.sys.system.mapper.UserNoticeStatusMapper;
import net.hn.hnms.sys.system.request.SysNoticeReq;
import net.hn.hnms.sys.system.service.ISysNoticeService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 公告 服务层实现
 *
 * @author ruoyi
 */
@RequiredArgsConstructor
@Service
public class SysNoticeServiceImpl implements ISysNoticeService {

    private final SysNoticeMapper baseMapper;
    @Autowired
     private UserNoticeStatusMapper statusMapper;
    private SysNoticeReq notice;

    @Override
    public TableDataInfo<SysNotice> selectPageNoticeList(SysNotice notice, PageQuery pageQuery) {
        LambdaQueryWrapper<SysNotice> lqw = new LambdaQueryWrapper<SysNotice>()
            .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle())
            .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType())
            .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy());
        Page<SysNotice> page = baseMapper.selectPage(pageQuery.build(), lqw);
        return TableDataInfo.build(page);
    }

    @Override
    public TableDataInfo<SysNotice> selectPageNoticeListByUserId(SysNoticeReq notice, PageQuery pageQuery) {

//        Integer userId = 102;  // 假设用户ID为102
        LoginUser loginUserInfo = getLoginUserInfo();

        // 使用自定义 SQL 查询进行分页
        IPage<SysNotice> page = baseMapper.selectPageNoticeListByUserId(pageQuery.build(), loginUserInfo.getUserId(),notice.getFlag());

        return TableDataInfo.build(page);
    }
    private LoginUser getLoginUserInfo() {
        LoginUser loginUser;
        try {
            loginUser = LoginHelper.getLoginUser();
        } catch (Exception e) {
            throw new HuaNengException(Constants.FAIL, "用户未登录,查询不到登录用户信息,无法获取信息");
        }
        return loginUser;
    }
    /**
     * 查询公告信息
     *
     * @param noticeId 公告ID
     * @return 公告信息
     */
    @Override
    public SysNotice updateNoticeById(Long noticeId,Integer flag) {
        LoginUser loginUserInfo = getLoginUserInfo();
        statusMapper.updateById(noticeId,loginUserInfo.getUserId(),flag);
        return selectNoticeById(noticeId);
    }
    @Override
    public SysNotice selectNoticeById(Long noticeId) {
        LoginUser loginUserInfo = getLoginUserInfo();
        Map<String, Object> deleteParams = new HashMap<>();
        deleteParams.put("notice_id", noticeId);
        deleteParams.put("user_id",loginUserInfo.getUserId());
        List<UserNoticeStatus> userNoticeStatuses = statusMapper.selectVoByMap(deleteParams);
        SysNotice sysNotice = baseMapper.selectById(noticeId);
        sysNotice.setReadStatus(userNoticeStatuses.get(0).getStatus());
        return sysNotice;

    }

    /**
     * 查询公告列表
     *
     * @param notice 公告信息
     * @return 公告集合
     */
    @Override
    public List<SysNotice> selectNoticeList(SysNotice notice) {
        return baseMapper.selectList(new LambdaQueryWrapper<SysNotice>()
            .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle())
            .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType())
            .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy()));
    }

    /**
     * 新增公告
     *
     * @param notice 公告信息
     * @return 结果
     */


    @Transactional  // 添加事务注解，确保操作在同一事务中
    @Override
    public int insertNotice(SysNoticeReq notice) {
        SysNotice sysNotice = toSysNotice(notice);

        // 插入公告记录
        int rowsAffected = baseMapper.insert(sysNotice);

        if (rowsAffected > 0) {
            // 获取刚插入公告的 ID
            Long noticeId = sysNotice.getNoticeId();
            List<Long> userIds = convertUserIdsToList(notice.getUserId());
            // 获取所有用户 ID 列表
//            List<Integer> userIds = userMapper.getAllUserIds();  // 假设你有一个获取所有用户 ID 的方法

            // 批量插入公告状态记录
            List<UserNoticeStatus> statusList = new ArrayList<>();
            for (Long userId : userIds) {
                UserNoticeStatus status = new UserNoticeStatus();
                status.setUserId(userId);
                status.setNoticeId(noticeId);
                status.setStatus("0"); // 默认未读
                status.setReadTime(null); // 未读时没有阅读时间
                statusList.add(status);
            }

            // 假设你有一个 UserNoticeStatusMapper 来进行批量插入
            statusMapper.insertBatch(statusList);

            return rowsAffected;  // 返回插入公告的影响行数
        }

        return 0;  // 如果插入公告失败，返回 0
    }
    // 将逗号分隔的字符串转换为 List<Long>
    private List<Long> convertUserIdsToList(String userIdsString) {
        List<Long> userIds = new ArrayList<>();
        if (userIdsString != null && !userIdsString.isEmpty()) {
            String[] userIdArray = userIdsString.split(",");
            for (String userIdStr : userIdArray) {
                try {
                    userIds.add(Long.parseLong(userIdStr.trim()));
                } catch (NumberFormatException e) {
                    // 处理转换异常，例如日志记录或跳过该 ID
                    e.printStackTrace();
                }
            }
        }
        return userIds;
    }


        public static SysNotice toSysNotice(SysNoticeReq req) {
            SysNotice notice = new SysNotice();
            notice.setNoticeTitle(req.getNoticeTitle());
            notice.setNoticeType(req.getNoticeType());
            notice.setNoticeContent(req.getNoticeContent());
          notice.setStatus(req.getStatus());
          notice.setRemark(req.getRemark());
//          notice.setNoticeId(req.getNoticeId());

            notice.setDeptId(req.getDeptId());
          notice.setUserId(req.getUserId());
            return notice;
        }




    /**
     * 修改公告
     *
     * @param notice 公告信息
     * @return 结果
     */
    @Override
    @Transactional  // 添加事务注解，确保操作在同一事务中
    public int updateNotice(SysNotice notice) {
        // 1. 删除公告相关的设计人员状态记录
        Map<String, Object> deleteParams = new HashMap<>();
        deleteParams.put("notice_id", notice.getNoticeId());  // 使用公告 ID 删除相关的人员状态
        statusMapper.deleteByMap(deleteParams);  // 删除公告设计人员状态记录

        // 2. 更新公告内容
        int rowsAffected = baseMapper.updateById(notice);  // 更新公告信息
        List<Long> userIds = convertUserIdsToList(notice.getUserId());
        if (rowsAffected > 0) {
            // 3. 新增设计人员状态记录
            List<UserNoticeStatus> statusList = new ArrayList<>();
            for (Long userId : userIds) {
                UserNoticeStatus status = new UserNoticeStatus();
                status.setUserId(userId);
                status.setNoticeId(notice.getNoticeId());  // 使用公告的 ID
                status.setStatus("0");  // 默认未读
                status.setReadTime(null);  // 未读时没有阅读时间
                statusList.add(status);
            }

            // 批量插入新增的设计人员状态记录
            statusMapper.insertBatch(statusList);
        }

        return rowsAffected;  // 返回公告更新的影响行数
    }

    /**
     * 删除公告对象
     *
     * @param noticeId 公告ID
     * @return 结果
     */
    @Override
    public int deleteNoticeById(Long noticeId) {
        return baseMapper.deleteById(noticeId);
    }

    /**
     * 批量删除公告信息
     *
     * @param noticeIds 需要删除的公告ID
     * @return 结果
     */
    @Override
    public int deleteNoticeByIds(Long[] noticeIds) {
        return baseMapper.deleteBatchIds(Arrays.asList(noticeIds));
    }

    @Override
    public List<SysNotice> getNoticeList(Long userId) {
        return baseMapper.getNoticeList(userId);
    }
}
